﻿

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text.RegularExpressions;
using Domain.Entidades;
using Domain.Interfaces.Repositorios;
using Domain.Interfaces.Servicos;


namespace Domain.Servicos
{
    public class SolicitacaoService : ServiceBase<solicitacoes_impressoras>, ISolicitacaoService
    {
        private readonly ISolicitacaoRepository _solicitacaoRepository;
        private readonly IUsuarioService _usuarioservice;


        public SolicitacaoService(ISolicitacaoRepository solicitacaoRepository, IUsuarioService usuarioservice) : base(solicitacaoRepository)
        {
            _solicitacaoRepository = solicitacaoRepository;
            _usuarioservice = usuarioservice;
        }


        public IEnumerable<VW_solicitacoes_impressoras> Listar(DateTime dt1, DateTime dt2)
        {
            VW_usuarios user = _usuarioservice.GetUsuarioLogado(0);
            Boolean flag = _usuarioservice.verifica_permissao(5355);

            return _solicitacaoRepository.Listar(dt1, dt2, user, flag);


        }


        public void enviar_email(VW_solicitacoes_impressoras sol, VW_usuarios user, string tipo)
        {
            try
            {
                string assunto = "";

                if (tipo == "s")
                {
                    assunto = "Solicitação de " + sol.tip_descricao.ToLower();
                }

                else
                { 
                    assunto = "Cancelamento de " + sol.tip_descricao.ToLower();
                }
                System.Net.Mail.MailMessage objNovoEmail = new System.Net.Mail.MailMessage();
                objNovoEmail.To.Add(new MailAddress("fusioncopiadora@hotmail.com"));
                objNovoEmail.To.Add(new MailAddress(user.usu_email + "@credivale.org.br"));

                IEnumerable<VW_tipo_email_envio_usuario> user_email = _usuarioservice.busca_email(29, sol.uni_codigo, sol.set_codigo).ToList();
                String cCorpoEmail = "";

               
                SmtpClient objSmtp = new SmtpClient();

                foreach (VW_tipo_email_envio_usuario usu in user_email)
                {
                    if (usu.usu_email != user.usu_email)
                    {
                        if (usu.usu_email.IndexOf('@') < 0)
                        {
                            objNovoEmail.To.Add(new MailAddress(usu.usu_email + "@credivale.org.br"));
                        }
                        else
                        {
                            objNovoEmail.To.Add(new MailAddress(usu.usu_email));
                        }
                    }
                }

                user_email = _usuarioservice.busca_email(29, 5000, 12);

                foreach (VW_tipo_email_envio_usuario usu in user_email)
                {
                    if (usu.usu_email != user.usu_email)
                    {

                        if (usu.usu_email.IndexOf('@') < 0)
                        {
                            objNovoEmail.To.Add(new MailAddress(usu.usu_email + "@credivale.org.br"));
                        }
                        else
                        {
                            objNovoEmail.To.Add(new MailAddress(usu.usu_email));
                        }
                    }
                }


                objNovoEmail.From = new MailAddress(user.usu_email + "@credivale.org.br");

                //Adiciona a prioridade do e-mail
                objNovoEmail.Priority = System.Net.Mail.MailPriority.High;

                //                // 'Adicionando o assunto ao atributo assunto
                objNovoEmail.Subject = assunto;

                //                // 'Formato de e-mail em Html?
                objNovoEmail.IsBodyHtml = true;

                string desc = "";
                if (sol.tip_codigo == 1)
                {
                    desc = "Quantidade: ";

                }
                else
                {
                    desc = "Descrição: ";

                }

                cCorpoEmail = "<html><head><meta charset='utf-8' /></head><body>" +
                              "<table style='border-color:#003b42; border-radius: 15px; font-family:Arial, Geneva, sans-serif;' cellspacing='0' cellpadding='30' width='800px' border='4' align='center'><tr><td>" +
                              "<div style='overflow: hidden; margin-left:auto; margin-right:auto;" +
                              " margin-bottom:15px; padding-bottom:10px; border-bottom: 5px solid #CCC; width:800px; float:none; text-align:center;'>" +
                              "<font style='font-size:40px;  font-weight:bold; color:#00494e'>SICOOB</font><font style='font-size:40px;  font-weight:bold; color:#00b0a0'>CREDIVALE</font><br/><br/>" +
                              " <font style='font-size:20px;  font-weight:bold; '>" + assunto + "</font><br/><br/></div>" +
                              "<div style='overflow: hidden; padding: 17px; margin-left:auto; margin-right:auto;" +
                              "margin-top:10px;  width:800px;float:none; text-align:LEFT;'>" +
                              "<font style='font-size:15px; font-weight:bold'>Data/Hora : </font>" + sol.sol_data.ToShortDateString() + " " + sol.sol_horario + "<br/><br/>" +
                              "<font style='font-size:15px; font-weight:bold'>Nº solicitação: </font>" + sol.sol_codigo + "<br/><br/>" +
                              "<font style='font-size:15px; font-weight:bold'>Tipo: </font>" + sol.tip_descricao + "<br/><br/>" +
                              "<font style='font-size:15px; font-weight:bold'>Solicitante: </font>" + sol.usu_nome + "<br/><br/>" +
                              "<font style='font-size:15px; font-weight:bold'>Unidade - Setor: </font>" + sol.uni_descricao + " - " + sol.set_descricao + "<br/><br/>" +
                              "<font style='font-size:15px; font-weight:bold'>Impressora: </font>" + sol.imp_descricao + "<br/><br/>" +
                               "<font style='font-size:15px; font-weight:bold'>Nº série: </font>" + sol.imp_numero_serie + "<br/><br/>" +
                              "<font style='font-size:15px; font-weight:bold'>" + desc + "</font>" + sol.sol_descricao + "<br/><br/>" +
                              "</div></td></tr></table></body></html>";


                objNovoEmail.Body = cCorpoEmail;
                objSmtp.Host = "smtp.credivale.org.br";
                objSmtp.Port = 587;

                //'Caso queira definir um tempo do timeout
                //'objSmtp.Timeout = 10
                // 'Define se deve usar autenticação ou não

                objSmtp.Credentials = new System.Net.NetworkCredential(user.usu_email + "@credivale.org.br", user.usu_senhaemail);

                //'Habilitar SSL ou não?
                //'Enviando a mensagem por e-mail

                objSmtp.Send(objNovoEmail);
                objNovoEmail.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception("email" + ex.Message);
            }
        }


        public void Inserir(solicitacoes_impressoras sol)
        {

            try
            {
                VW_usuarios user = _usuarioservice.GetUsuarioLogado(0);
                _solicitacaoRepository.Inserir(sol, user.usu_codigo);
                enviar_email(_solicitacaoRepository.carrega_sol_email(sol.sol_codigo), user, "s");
            }

            catch (Exception ex)
            {

                throw ex;
            }

        }


        public string carrega_impressora(int unidade, int setor)
        {
            try
            {
                return _solicitacaoRepository.carrega_impressora(unidade, setor);

            }
            catch (Exception ex)
            {

                throw ex;
            }

        }


        public void deletar(solicitacoes_impressoras sol)
        {
            try
            {

                VW_usuarios user = _usuarioservice.GetUsuarioLogado(0);

                if (_usuarioservice.verifica_permissao(5355) == false)
                {
                    if (sol.sol_data.Date < DateTime.Now.Date)
                    {
                        throw new Exception("O cancelamento da solicitação é permitido somente no mesmo dia");
                    }
                }
                VW_solicitacoes_impressoras vw_sol = _solicitacaoRepository.carrega_sol_email(sol.sol_codigo);

                _solicitacaoRepository.deletar(sol, user.usu_codigo);
                enviar_email(vw_sol, user, "c");
            }
            catch (Exception ex)

            {

                throw ex;
            }

        }

        public string carrega_nserie(int impressora)
        {
            try
            {
                return _solicitacaoRepository.carrega_nserie(impressora);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        public IEnumerable<tipo_solicitacao> carrega_tipo_solicitacoes()
        {
            try
            {
                return _solicitacaoRepository.carrega_tipo_solicitacoes();
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        public solicitacoes_impressoras GetId(Int64 codigo)
        {
            try
            {
                return _solicitacaoRepository.GetId(codigo);
            }
            catch (Exception ex)
            {

                throw ex;
            }


        }

        public VW_solicitacoes_impressoras carrega_sol_email(Int64 codigo)
        {
          try
            {
                return _solicitacaoRepository.carrega_sol_email(codigo);
              }
            catch (Exception ex)
            {

                throw ex;
            }
        
        }


    }
}
